//defer关键字 一个函数 在执行之后 在结束之前 触发
package main

import "fmt"

func main() {
	defer fmt.Println("main end 1") //虽然写在前,但触发在后
	defer fmt.Println("main end 2") //defer 栈结构,后进先出
	fmt.Println("main hello go 1")
	fmt.Println("main hello go 2")
	returnAndDefer()
	//defer 在函数执行结束后才开始执行,且为栈结构,先进后出,所以顺序为
	/*
		main hello go 1
		main hello go 2
		return
		defer
		main end 2
		main end 1
	*/
}

func returnAndDefer() int {
	defer deferFun()
	return returnFun()
}

func deferFun() {
	fmt.Println("defer")
}

func returnFun() int {
	fmt.Println("return")
	return 0
}
